package com.eidos.blogs.openapi.utils;

import java.math.BigDecimal;
import java.util.List;
import java.util.Random;

/**
 * @author ： Eidos
 * @date ：Created in 2021/1/4
 * @description：
 * @modified By：
 * @version: 1.0
 */
public class RandomNumberUtils {

    /**
     生成min到max范围的浮点数
     **/
    public static double nextDouble(final int num,final double total) {
//        double max = total / num * 2;
//        double randomMoney = new Random().nextDouble() * max;
//        randomMoney = randomMoney <= 0.01 ? 0.01 : randomMoney;
//        double money = Math.floor(randomMoney * 100) / 100;
        BigDecimal max=new BigDecimal(Double.valueOf(total)).divide(new BigDecimal(Double.valueOf(num)),2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(2));
        BigDecimal randomMoney= new BigDecimal(new Random().nextDouble()).multiply(max).setScale(2,BigDecimal.ROUND_HALF_UP);
        if(randomMoney.compareTo(new BigDecimal(Double.valueOf(0.01)))<=0){
            randomMoney=new BigDecimal(Double.valueOf(0.01));
        }
        return randomMoney.doubleValue();
    }

    /**
     * Random 随机生成一个区间在[min , max]的数值
     * @param min
     * @param max
     * @return
     */
    public static double nextInt(final int min, final int max) {
        return new Random().nextInt(max - min + 1) + min;
    }


    /**
     * 提供精确加法计算的add方法
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static double add(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确减法运算的sub方法
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static double sub(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确乘法运算的mul方法
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static double mul(double value1,double value2){
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供精确的除法运算方法div
     * @param value1 被除数
     * @param value2 除数
     * @param scale 精确范围
     * @return 两个参数的商
     * @throws IllegalAccessException
     */
    public static double div(double value1,double value2,int scale) throws IllegalAccessException{
        //如果精确范围小于0，抛出异常信息
        if(scale<0){
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
        return b1.divide(b2, scale).doubleValue();
    }


    public static Long getRandomMoney(final int num, final Long total, final Integer isHit, final List<String> hitNums) {
        BigDecimal max = new BigDecimal(total).divide(new BigDecimal(num + 1), 0, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(2));
        BigDecimal randomMoney = new BigDecimal(new Random().nextDouble()).multiply(max).setScale(0, BigDecimal.ROUND_HALF_DOWN);
        if (randomMoney.compareTo(new BigDecimal(1L)) <= 0) {
            randomMoney = new BigDecimal(1L);
        }
        if (isHit == 1) {
            String str = randomMoney.toString();
            str = str.substring(str.length() - 1, str.length());
            boolean flag = false;
            for (String hitNum : hitNums) {
                if (org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase(str, hitNum)) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                return getRandomMoney(num, total, isHit, hitNums);
            } else {
                return randomMoney.longValue();
            }
        } else {
            return randomMoney.longValue();
        }
    }

}
